#include"curve.h"
//生成样本点并保存至“some.dat"文件中 
void generate_dataset(const char* filename, int type, double a, double b, double c, double d, int num_points) {
    FILE* file = fopen(filename, "w"); // 打开文件用于写入
    if (file == NULL) {
        perror("文件打开失败");
        exit(EXIT_FAILURE);
    }
//开始生成样本点数据 
    double x, y;
	double i;
    for (i = -num_points; i < num_points; i+=0.1) {
        x = i; // x值从0到num_points-1
        switch (type) {
            case 1: // 一次函数
                y = a * x + b;
                break;
            case 2: // 二次函数
                y = a * x * x + b * x + c;
                break;
            case 3: // 三次函数
                y = a * x * x * x + b * x * x + c * x + d;
                break;
            default:
                fprintf(stderr, "未知的函数类型\n");
                exit(EXIT_FAILURE);
        }
        // 写入样本点到文件
        fprintf(file, "%lf %lf\n", x, y);
    }

    fclose(file); // 关闭文件
}

// 从文件读取数据到DataPoint数组
int readDataFromFile(const char *filename, DataPoint **data,int num_points) {
    FILE *fp = fopen(filename, "r");//打开文件 
    if (fp == NULL) {
        perror("打开文件失败");
        return -1;
    }

    int capacity = num_points;   // 定义初始的数组容量 
    int size = 0;//实际存储的数据元素个数初始化为0 
    *data = (DataPoint *)malloc(capacity * sizeof(DataPoint)); //使用malloc函数为Datapoint分配初始内存空间 
    if (*data == NULL) {
        perror("内存分配失败");
        fclose(fp);
        return -1;
    }

    while (!feof(fp)) { //持续读取数据 
        if (size >= capacity) {
            capacity *= 2;//当已存储的数据超过数组容量时将容量翻倍并重新分配内存空间 
            DataPoint *new_data = (DataPoint *)realloc(*data, capacity * sizeof(DataPoint));//重新分配内存 
            if (new_data == NULL) {
                perror("内存重新分配失败");
                free(*data);
                fclose(fp);
                return -1;//检查内存是否分配成功 
            }
            *data = new_data;
        }

        if (fscanf(fp, "%lf %lf", &((*data)[size].x), &((*data)[size].y)) == 2) {//检验是否成对出现 
            size++;//记录存储的数据个数 
        }
        
    }
    fclose(fp);
    return size;
}